package criterios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import baseDeDatos.GestorBD;
import datosFamilias.*;

public class CriterioEmbarazadas extends CriterioAbstracto
{
    private String consultaEmbarazadas;
    private static ArrayList<String> embarazoDetalle = null;
    
    public CriterioEmbarazadas(GestorBD base)
    {
        baseDeDatos = base;
        if(embarazoDetalle == null)
        {
            cargarEmbarazosPorDefecto();
        }
        cargarConsulta();
    }

    private void cargarConsulta()
    {
        consultaEmbarazadas = "SELECT p.id, p.name, p.surname, YEAR( CURDATE( ) ) - YEAR( p.borndate ) + IF( DATE_FORMAT( CURDATE( ) , '%m-%d' ) > DATE_FORMAT( p.borndate, '%m-%d' ) , 0, -1 ), p.direction_id, z.descripcion " +
                              "FROM people p JOIN encuestasrtas s ON ( p.id = s.persona_id ) " +
                                            "JOIN encuestasrtas t ON ( p.id = t.persona_id ) " +
                                            "JOIN pregopcions z ON ( t.pregunta_id = z.pregunta_id AND t.opcion = z.opcion ) " +
                              "WHERE (s.pregunta_id = 42 AND  STR_TO_DATE(s.valor, '%e/%c/%Y') > CURDATE()) AND (t.pregunta_id = 43) AND (";
        
        for(int i = 0; i < embarazoDetalle.size(); i++)
        {
            consultaEmbarazadas = consultaEmbarazadas + "z.descripcion = '" + embarazoDetalle.get(i);
            if(i+1 < embarazoDetalle.size())
            {
                consultaEmbarazadas = consultaEmbarazadas + "' OR ";
            }
            else
            {
                consultaEmbarazadas = consultaEmbarazadas +"')";
            }
        }
 
    }

    @Override
    public void ejecutarConsultas(ArrayList<Familia> familias, int criterio) {
        try 
        {
            if(!embarazoDetalle.isEmpty())
            {
                // Realizamos la consulta
                ResultSet resultadosEmbarazadas = baseDeDatos.consultar(consultaEmbarazadas);

                // Mientras haya tuplas resultado
                while(resultadosEmbarazadas.next())
                {
                    String direccionEmb = resultadosEmbarazadas.getString(5);
                    int index = 0;

                    // Buscamos la familia correspondiente a la embarazada de acuerdo a la direccion
                    while(index < familias.size() && !direccionEmb.equals(familias.get(index).obtenerDireccion()))
                    {
                        index++;
                    }

                    Familia f = familias.get(index);
                    Persona persEmb = null;

                    // Verificamos si la persona fue creada, en caso de que exista la obtenemos, caso contrario, la creamos.
                    if(f.existeIntegrante(resultadosEmbarazadas.getInt(1)))
                    {
                        persEmb = f.obtenerIntegrante(resultadosEmbarazadas.getInt(1));
                    }
                    else
                    {
                        persEmb = new Persona(resultadosEmbarazadas.getInt(1), resultadosEmbarazadas.getString(2)+" "+resultadosEmbarazadas.getString(3), resultadosEmbarazadas.getInt(4), direccionEmb);
                        f.agregarIntegrante(persEmb);
                    }

                    // Agregamos que la persona esta embarazada
                    persEmb.agregarDato(resultadosEmbarazadas.getString(6), criterio);
                }
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(CriterioEnfermedad.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static ArrayList<String> obtenerEmbarazosPorDefecto()
    {
        ArrayList<String> detalles = new ArrayList<String>();
        detalles.add("NORMAL");
        detalles.add("COMPLICADO");
        return detalles;
    }
    
    public static void cambiarDetallesEmbarazos(ArrayList<String> detalles)
    {
        embarazoDetalle = detalles;
    }
    
    public static void cargarEmbarazosPorDefecto()
    {
        embarazoDetalle = obtenerEmbarazosPorDefecto();
    }
}